#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
消息模型
定义消息记录相关的数据库表结构
"""

from sqlalchemy import Column, String, Text, Integer, Boolean
from .base import BaseModel, db


class MessageType:
    TEXT = 'text'
    IMAGE = 'image'
    FILE = 'file'
    VOICE = 'voice'
    VIDEO = 'video'
    SYSTEM = 'system'


class MessageDirectionEnum:
    INCOMING = 1  # 接收
    OUTGOING = 2  # 发送
    

class Message(BaseModel):
    """
    消息模型
    存储微信消息记录
    """
    __tablename__ = 'messages'

    # 所属账号
    account = Column(String(100), nullable=False, comment='所属账号，逻辑外键关联belong表的id列')
    
    # 发送者名称
    sender_name = Column(String(100), nullable=False, comment='发送者名称')
    
    # 接收者名称
    receiver_name = Column(String(100), nullable=False, comment='接收者名称')
    
    # 消息内容
    content = Column(Text, nullable=False, comment='消息内容')
    
    # 消息类型：1(文本), 2(图片), 3(文件), 4(语音), 5(视频), 6(系统消息)
    message_type = Column(Integer, nullable=False, default=1, comment='消息类型，1(文本), 2(图片), 3(文件), 4(语音), 5(视频), 6(系统消息)')
    
    # 聊天类型：private(私聊), group(群聊)
    chat_type = Column(Integer, nullable=False, default=1, comment='聊天类型，1(私聊), 2(群聊)')
    
    # 群聊名称（如果是群聊消息）
    group_name = Column(String(100), nullable=True, comment='群聊名称')
    
    # 消息方向：incoming(接收), outgoing(发送)
    direction = Column(Integer, nullable=False, default=1, comment='消息方向，1(接收), 2(发送)')
    
    # 是否为自动回复消息
    is_auto_reply = Column(Boolean, default=False, nullable=False, comment='是否为自动回复消息')
    
    # 原始消息ID（逻辑关联，用于回复消息）
    original_message_id = Column(String(100), nullable=True, comment='原始消息UUID')
    
    # 消息状态：sent(已发送), delivered(已送达), read(已读), failed(发送失败)
    status = Column(String(20), nullable=False, default='sent', comment='消息状态')
    
    # 文件路径（如果是文件消息）
    file_path = Column(String(500), nullable=True, comment='文件路径')
    
    # 文件大小（字节）
    file_size = Column(Integer, nullable=True, comment='文件大小')
    
    # 消息摘要（用于长消息的简短描述）
    summary = Column(String(200), nullable=True, comment='消息摘要')
    
    # 是否已处理（用于自动回复等功能）
    is_processed = Column(Boolean, default=False, nullable=False, comment='是否已处理')
    
    # 注意：使用逻辑关联而非外键关联
    # 可通过 Message.query.filter_by(id=self.original_message_id).first() 获取原始消息
    
    def __repr__(self):
        return f'<Message(id={self.id}, sender="{self.sender_name}", receiver="{self.receiver_name}", type="{self.message_type}")>'
    
    def get_content_preview(self, max_length=50):
        """
        获取消息内容预览
        
        Args:
            max_length (int): 最大长度
            
        Returns:
            str: 消息内容预览
        """
        from utils.enum.message_enum import MessageTypeEnum
        
        # 将整数类型的消息类型转换为字符串
        message_type_str = MessageTypeEnum.to_str(self.message_type)
        
        if message_type_str != 'text':
            return f'[{message_type_str.upper()}]'
        
        if len(self.content) <= max_length:
            return self.content
        
        return self.content[:max_length] + '...'